CSS 몚ì ëììžì íì íì©íì¬ ì ìžê³ ì¬ì©ìì 겜íì í¥ììí€ë ë§€í¹ì ìŽê³ ì êµí ì ëë©ìŽì ìíì€ë¥Œ ë§ë€ìŽ ë³Žìžì. ìí¥ë ¥ ìë ì¹ ì ëë©ìŽì ì ìí íµì¬ ê°ë , ê³ êž êž°ì , ëªšë² ì¬ë¡ë¥Œ í구í©ëë€.
CSS 몚ì ëììž: êžë¡ë² ì¹ì ìí ì êµí ì ëë©ìŽì ìíì€ ì°ì¶íêž°
ì€ëë ìê° ì€ì¬ì ëì§íž í겜ìì ì ì ìž ìží°íìŽì€ë ë ìŽì ì¶©ë¶íì§ ììµëë€. ì¬ì©ìë€ì ëì ìŽê³ , ë§€ë ¥ì ìŽë©°, ì§êŽì ìž ê²œíì êž°ëí©ëë€. CSS 몚ì ëììžì ìŽë¥Œ ë¬ì±íêž° ìí ê°ë ¥íê³ ì ê·Œì± ëì ë구 몚ìì ì ê³µíì¬, ê°ë°ìì ëììŽëê° ì¬ì©ì륌 ìëŽíê³ , ì 볎륌 ì ë¬íë©°, ê°ì±ì ë¶ë¬ìŒìŒí€ë ì êµí ì묎íë ì ëë©ìŽì ìíì€ë¥Œ ë§ë€ ì ìê² íŽì€ëë€. ìŽ ê²ì묌ììë ì ìžê³ ì¬ì©ì륌 ìí ìŽë¬í ìíì€ë¥Œ ì ìíë êž°ì 곌 곌íì ê¹ìŽ íê³ ë€ìŽ, ì¬ë¬ë¶ì ì¹ ì¡Žì¬ê°ìŽ ì ìžê³ì ìŒë¡ ë§€í¹ì ìŽê³ ì¬ì©ì ì¹íì ìŽ ëëë¡ ë³Žì¥í©ëë€.
ì묎íë ì ëë©ìŽì ìíì€ì 볞ì§
ì묎íë ì ëë©ìŽì ìíì€ë ëšìí ì¬ë¬Œì ìì§ìŽê² íë ê²ìŽ ìëëŒ, ìŒë šì ì ëë©ìŽì ì ì¡°ìšíì¬ ìŽìŒêž°ë¥Œ ì ë¬íê³ , ì¬ì©ìì ì¬ì ì ìëŽíë©°, ìží°íìŽì€ì ìžì§ë êž°ë¥ì±ì í¥ììí€ë ê²ì ëë€. ì¹ ììë€ì ìí ë°ë ëŒê³ ìê°íŽë³Žìžì. ê° ìì§ìì ìëì ìŽê³ , ìê°ìŽ ë§ì¶°ì ž ììŒë©°, ë í¬ê³ ìì§ë ¥ ìë 겜íì êž°ì¬í©ëë€. êžë¡ë² ì¬ì©ì륌 ëììŒë¡ë, ìŽë 묞íì ëìì€ì ìžìŽ ì¥ë²œì ìŽìíì¬ ë³Žížì ìŒë¡ ìŽíŽëê³ ìžì ë°ë ì ëë©ìŽì ì ë§ëë ê²ì ì믞í©ëë€.
íšê³Œì ìž ì묎íë ìíì€ë¥Œ ë·ë°ì¹šíë íµì¬ ìì¹ì ë€ì곌 ê°ìµëë€:
- íìŽë°ê³Œ ìŽì§(Easing): ì ëë©ìŽì ì ìëì ê°ìëë ê·ž ëëì í° ìí¥ì 믞칩ëë€. ë¶ëëœê³ ìì°ì€ë¬ìŽ ìŽì§ íšì(ease-in-out ë±)ë ì 묞ì ìŽê³ ìŠê±°ìŽ ê²œíì ìíŽ ë§€ì° ì€ìí©ëë€.
- ìì°šì íëŠ: ì ëë©ìŽì ì ë ŒëŠ¬ì ìŒë¡, íëì© ì°šë¡ë¡ ëë ì ì í ê²œì° ë³ë ¬ë¡ ì ê°ëìŽ ì§ìì ììž¡ ê°ë¥ì±ì ë§ë€ìŽìŒ í©ëë€.
- 목ì ìŽ ìë ìì§ì: 몚ë ì ëë©ìŽì ìë 죌ì륌 ëê±°ë, ìí ë³í륌 ëíëŽê±°ë, íŒëë°±ì ì ê³µíê±°ë, ì¬ì©ì±ì ê°ì íë ë±ì ìŽì ê° ììŽìŒ í©ëë€. 죌ì륌 ë¶ì°ìí€ê±°ë íŒëì ì€ ì ìë ë¶íìí ìì§ìì íŒíŽìŒ í©ëë€.
- ìŒêŽì±: ê°ë ¥í ëžëë ììŽëŽí°í°ë¥Œ 구ì¶íê³ íµìŒë ì¬ì©ì 겜íì 볎ì¥íêž° ìíŽ ì¹ì¬ìŽížë ì í늬ìŒìŽì ì ë°ì ê±žì³ ìŒêŽë ì ëë©ìŽì ì€íìŒê³Œ 늬ë¬ì ì ì§íŽìŒ í©ëë€.
- ë°ìì±: ì ëë©ìŽì ì ë€ìí í멎 í¬êž°ì ì¥ì¹ì ë§ê² ì°ìíê² ì¡°ì ëìŽ ì ìžê³ì ìŒë¡ ìµì ì ì±ë¥ê³Œ ìê°ì ë§€ë ¥ì 볎ì¥íŽìŒ í©ëë€.
ì êµí ì ëë©ìŽì ì ìí CSS íì©
CSSë ì¬ë¬ë¶ì ì ëë©ìŽì ë¹ì ì íì€ë¡ ë§ë€ìŽ ì€ ê°ë ¥í ìì±ê³Œ íšì ìžížë¥Œ ì ê³µí©ëë€. ìë°ì€í¬ëŠœížê° ë ë³µì¡í ì ìŽë¥Œ ì ê³µí ì ìì§ë§, CSSë êŽë²ìí ì ëë©ìŽì ì구 ì¬íì ì²ëЬíë ì±ë¥ìŽ ë°ìŽëê³ ì ìžì ìž ë°©ë²ì ì ê³µíë¯ë¡ ì ìžê³ íë¡ ížìë ê°ë°ììê² ììŽìë ì ë ë구ì ëë€.
1. CSS ížëì§ì (Transitions): 몚ì ì Ʞ볞 êµ¬ì± ìì
CSS ížëì§ì ì ê°ëší ìí ë³íì ìŽìì ì ëë€. ìì±ìŽ ë³ê²œë ë(ì: hover, focus ëë íŽëì€ ë³ê²œ ì), ížëì§ì ì ì§ì ë êž°ê° ëì íŽë¹ ë³ê²œì ë¶ëëœê² ì ëë©ìŽì íí©ëë€. ë²íŒ ížë², ë©ëŽ íì, íŒ íë í¬ì»€ì€ ìíì ê°ì 믞ë¬í íšê³Œì íìí©ëë€.
죌ì ìì±:
transition-property: ížëì§ì ì ì ì©í CSS ìì±ì ì§ì í©ëë€.transition-duration: ížëì§ì ìŽ ìë£ëë ë° ê±žëŠ¬ë ìê°ì ì€ì í©ëë€.transition-timing-function: ížëì§ì ì ìë 곡ì ì ì ìí©ëë€ (ì:ease,linear,ease-in-out).transition-delay: ížëì§ì ìŽ ììëêž° ì ì ì§ì° ìê°ì ì§ì í©ëë€.
ìì: ížë² ì 칎ëì í¬êž°ì 귞늌ì ì ëë©ìŽì .
.card {
transform: scale(1);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
}
.card:hover {
transform: scale(1.05);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
êžë¡ë² ì¬ì©ì륌 ìíŽ 'hover'ì ê°ì ìíì ëí ì€ëª ì ìž ì©ìŽë 볎ížì ìŒë¡ ìŽíŽë©ëë€. íµì¬ì ì¬ì©ìì ìží°ëí°ëž ì¹ êŽìµì ëí ìµìíšê³Œ ìêŽììŽ ìê°ì íŒëë°±ìŽ ëª ííê³ ìŠê°ì ìŽëë¡ ë³Žì¥íë ê²ì ëë€.
2. CSS í€íë ì(Keyframes): ë³µì¡í ìíì€ ì¡°ìšíêž°
ì ëë©ìŽì
ì ì§í 곌ì , ì¬ë¬ ëšê³, ë³µì¡í íìŽë° ë° ë°©í¥ ë³ê²œì ëíŽ ë ë§ì ì ìŽê° íìí ë, CSS í€íë ì(@keyframes ê·ì¹ê³Œ animation ìì± ì¬ì©)ìŽ íŽëµì
ëë€. ìŽê²ìŽ ë°ë¡ ì§ì í ìë¬Žê° ììëë ì§ì ì
ëë€.
@keyframes ê·ì¹: ì ëë©ìŽì
ì ëšê³ë¥Œ ì ìí©ëë€. íŒìŒíž(0%ìì 100%)ë from (0%), to (100%)ì ê°ì í€ìë륌 ì¬ì©íì¬ ì ëë©ìŽì
ì ë€ë¥ž ì§ì ìì ì€íìŒì ì§ì í ì ììµëë€.
animation ìì±: ìŽë ì¬ë¬ ì ëë©ìŽì
êŽë š ìì±ì ëí ì¶ìœíì
ëë€:
animation-name:@keyframesê·ì¹ì ì°ê²°í©ëë€.animation-duration: ì ëë©ìŽì ì êžžìŽë¥Œ ì€ì í©ëë€.animation-timing-function: ìë 곡ì ì ì ìŽí©ëë€.animation-delay: ì ëë©ìŽì ìŽ ììëêž° ì ì§ì° ìê°ì ì€ì í©ëë€.animation-iteration-count: ì ëë©ìŽì ìŽ ì¬ìëë íì륌 ê²°ì í©ëë€ (ì:1,infinite).animation-direction: ì ëë©ìŽì ìŽ ì ë°©í¥, ìë°©í¥ ëë êµëë¡ ì¬ìëìŽìŒ íëì§ ì§ì í©ëë€ (ì:normal,alternate,reverse).animation-fill-mode: ì ëë©ìŽì ì íì ì ì©ë ì€íìŒì ì ìí©ëë€ (ì:forwards,backwards,both).animation-play-state: ì ëë©ìŽì ì ìŒì ì€ì§íê³ ì¬ê°í ì ììµëë€ (ì:running,paused).
ìì: ë€ëšê³ ë¡ë© ì ëë©ìŽì ìíì€.
@keyframes loading-dots {
0%, 20% {
transform: translateY(0) scale(1);
opacity: 1;
}
40% {
transform: translateY(-15px) scale(1.1);
opacity: 0.7;
}
60% {
transform: translateY(0) scale(1);
opacity: 1;
}
80%, 100% {
transform: translateY(0) scale(1);
opacity: 0.5;
}
}
.loader-dot {
display: inline-block;
width: 10px;
height: 10px;
background-color: #3498db;
border-radius: 50%;
margin: 0 5px;
animation: loading-dots 1.4s infinite ease-in-out;
}
.loader-dot:nth-child(2) {
animation-delay: 0.2s;
}
.loader-dot:nth-child(3) {
animation-delay: 0.4s;
}
ìŽ ììë ìž ê°ì ì ìŽ ìì°šì ìŒë¡ ì ëë©ìŽì
ëë ê²ì 볎ì¬ì€ëë€. íì ì ì animation-delay륌 ì¬ì©í멎 ì찚륌 ë, ì묎íë íšê³Œê° ë§ë€ìŽì§ëë€. íŽìž ì¬ì©ììê² ë¡ë© íìêž°ì ê°ì ìê°ì ì ížë Ʞ볞ìŽë©°, ë¶ëëœê³ ê±°ì¬ëŠ¬ì§ ìëë¡ íë ê²ìŽ ì¢ì 첫ìžìì ìíŽ ê°ì¥ ì€ìí©ëë€.
ì묎íë ìíì€ ì ì: êžë¡ë² ì¬ì©ì륌 ìí ëªšë² ì¬ë¡
ì ìžê³ì ìŒë¡ ê³µê°ì ì»ë íšê³Œì ìž ì ëë©ìŽì ìíì€ë¥Œ ë§ë€ë €ë©Ž ì¬ë € ê¹ì ì ê·ŒìŽ íìí©ëë€. ë€ìì 죌ì ê³ ë € ì¬íì ëë€:
1. íë €íšë³Žë€ ì¬ì©ì 겜íì ì°ì ìíêž°
ìê°ì ìŒë¡ ë§€ë ¥ì ìŽëëŒë ì ëë©ìŽì ìŽ ì¬ì©ì±ì ì íŽíŽìë ì ë©ëë€. ì ëë©ìŽì ìŽ ë€ìì 충족íëì§ íìžíìžì:
- ì¶©ë¶í ë¹ ë¥Œ ê²: ì¬ì©ìë€ì ì°žìì±ìŽ ììµëë€. ë묎 ì€ë 걞늬ë ì ëë©ìŽì ì ì¢ì ê°ì ì€ ì ììµëë€. ëë¶ë¶ì ìížìì©ìì 0.2ìŽìì 0.8ìŽ ì¬ìŽì ì§ì ìê°ì 목íë¡ íìžì.
- ë°©íŽëì§ ìì ê²: ìœí ìž ë¥Œ ê°ëŠ¬ê±°ë, ìêž°ì¹ ìê² ìì§ìŽê±°ë, ì¬ì©ììê² ì íí íìŽë°ì ì구íë ì ëë©ìŽì ì íŒíìžì.
- ì ê·Œ ê°ë¥í ê²: ìì§ìì 믌ê°í ì¬ì©ì륌 ìíŽ ëªšì
ì ì€ìŽë ìµì
ì ì ê³µíìžì (ì:
prefers-reduced-motion믞ëìŽ ì¿ŒëŠ¬ ì¬ì©). ìŽë ì ìžê³ì ë€ìí ì¬ì©ì ì구ì ëí í¬ì©ì±ì ìíŽ ë§€ì° ì€ìí©ëë€.
prefers-reduced-motion ìì:
/* Default animation */
.element-to-animate {
animation: subtle-fadeIn 1s ease-in-out;
}
/* Reduce motion for users who prefer it */
@media (prefers-reduced-motion: reduce) {
.element-to-animate {
animation: none;
opacity: 1;
}
}
2. ì ëë©ìŽì ìŒë¡ ì€í 늬í ë§íêž°
ì ëë©ìŽì ì ì¬ì©ìì ìì ì ì ëíê³ , ë³µì¡í 곌ì ì ì€ëª íë©°, íŒëë°±ì ì ê³µí ì ììµëë€. ìì¬ì íëŠì ëíŽ ìê°íŽë³Žìžì:
- ìšë³Žë©(Onboarding): ê°ì 곌ì ì ëšê³ë¥Œ ì ëë©ìŽì ìŒë¡ ë§ë€ìŽ ë ë§€ë ¥ì ìŽê³ ë ë¶ëŽì€ëœê² ë껎ì§ê² í©ëë€.
- ë°ìŽí° ìê°í: ì°šíž ì íìŽë ì ë°ìŽížë¥Œ ì ëë©ìŽì ìŒë¡ ì²ëЬíì¬ ë³í륌 ëª ííê² ê°ì¡°í©ëë€.
- íŒëë°± 룚í: ì±ê³µì ìž ì ì¶ í 첎í¬ë§í¬ ì ëë©ìŽì 곌 ê°ìŽ ë¯žë¬í ì ëë©ìŽì ì ì¬ì©íì¬ ìì ì íìží©ëë€.
ìì: ë€ëšê³ íŒì ìí ì ëë©ìŽì ì§í íìêž°.
ì¬ë¬ ëšê³ë¡ 구ì±ë íŒì ììíŽë³Žìžì. ì¬ì©ìê° ê° ëšê³ë¥Œ ìë£í ëë§ë€ ì§í íìêž°ê° ë€ì ëšê³ë¡ ë¶ëëœê² ì ëë©ìŽì ë ì ììµëë€. ìŽë ëª íí ìê°ì íŒëë°±ì ì ê³µíê³ êž°ë륌 êŽëЬí©ëë€.
@keyframes progress-fill {
from { width: 0%; }
to { width: 100%; }
}
.progress-bar-fill {
height: 5px;
background-color: #2ecc71;
animation: progress-fill 0.5s forwards;
width: 0%; /* Initial state */
}
/* When step 1 is complete, target the fill for step 2 */
.step-1-complete .progress-bar-fill {
width: 33.3%; /* Or animate to the exact point */
animation-name: progress-fill;
animation-duration: 0.5s;
animation-timing-function: ease-out;
animation-fill-mode: forwards;
}
ìŽë¬í ì íì ì ëë©ìŽì ì ì§í ìí©ìŒë¡ 볎ížì ìŒë¡ ìŽíŽëë©°, ì¬ì©ìê° ìµìíì§ ìì ìží°íìŽì€ìì ìì ì ìë£í ì ìë êžë¡ë² ì ììê±°ë ëë ìë¹ì€ íë«íŒìì í¹í ì ì©í©ëë€.
3. íìŽë° ë° ìŽì§ íšì ë§ì€í°íêž°
íìŽë° íšìì ì íì ì ëë©ìŽì
ìŽ ìŽë»ê² ìžìëëì§ì ê¹ì ìí¥ì 믞칩ëë€. ease-in-outìŽ ì¢
ì¢
ìì í ì íìŽì§ë§, ë€ë¥ž ê²ë€ì ì€íí멎 ë
í¹í 결곌륌 ì»ì ì ììµëë€.
ease: ëëŠ¬ê² ììíì¬ ê°ìíë€ê° ëìì ë€ì ëë €ì§ëë€.linear: ì 첎ì ìŒë¡ ìŒì í ìë륌 ì ì§í©ëë€. ì€í¬ë¡€ íšê³Œì²ëŒ ì íí íìŽë°ìŽ íìí ì ëë©ìŽì ì ì¢ìµëë€.ease-in: ëëŠ¬ê² ììíì¬ ê°ìí©ëë€.ease-out: ë¹ ë¥Žê² ììíì¬ ê°ìí©ëë€.ease-in-out: ëëŠ¬ê² ììíì¬ ìë륌 ëìë€ê° ë€ì ëë €ì§ëë€. ì¢ ì¢ ê°ì¥ ìì°ì€ëœê² ë껎ì§ëë€.cubic-bezier(n,n,n,n): ì¬ì©ì ì ìë ì ë°í íìŽë° 곡ì ì íì©í©ëë€.
ìì: ì¬ì©ì ì ì cubic-bezier륌 ì¬ì©í 'ë°ìŽì€' íšê³Œ.
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
}
.bouncing-element {
animation: bounce 1s infinite;
}
/* A smoother bounce using cubic-bezier */
.smoother-bounce {
animation: bounce 1s cubic-bezier(.215,.61,.355,1) infinite;
}
ì ìžê³ì ìŒë¡ ë¶ëë¬ìŽ ë°ìŽì€ë ê±°ì¬ëŠ¬ì§ ììŒë©Žì ìížìì© ê°ë¥í ìì륌 ëíëŒ ì ììµëë€. íµì¬ì 믞ë¬íšì ëë€.
4. ìŠê±°ìŽ ë§ìŽí¬ë¡ìží°ëì ë§ë€êž°
ë§ìŽí¬ë¡ìží°ëì ì ì¬ì©ì ìížìì©ì í¥ììí€ë ìê³ , ì¢ ì¢ ëì ëì§ ìë ì ëë©ìŽì ì ëë€. íŒëë°±ì ì ê³µíê³ , ìì ì íìžíê±°ë, ëšìí 겜íì ë ìŠê²ê² ë§ëëë€.
- ë²íŒ ë륎Ʞ: íŽëŠ ì ìœê°ì í¬êž° ì¶ì ëë ìì ë³ê²œ.
- ë¡ë© ìí: 믞ë¬í ì€íŒë ëë ì€ìŒë í€ ì€í¬ëа.
- ì€ë¥ ë©ìì§: ì못ë ì ë ¥ì ëí ë¶ëë¬ìŽ íë€ëŠŒ ì ëë©ìŽì .
ìì: ì ëë©ìŽì 첎í¬ë°ì€.
ì¬ì©ìê° ë°ì€ë¥Œ 첎í¬í멎, ìŠê±°ìŽ ì ëë©ìŽì 곌 íšê» ì²Ží¬ íìë¡ ë³íë ì ììµëë€.
/* Base styles for the checkbox */
.custom-checkbox {
position: relative;
display: inline-block;
width: 20px;
height: 20px;
border: 2px solid #ccc;
border-radius: 4px;
cursor: pointer;
transition: all 0.3s ease-in-out;
}
/* Style for the checkmark using ::after pseudo-element */
.custom-checkbox::after {
content: '';
position: absolute;
left: 6px;
top: 2px;
width: 5px;
height: 10px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg) scale(0);
opacity: 0;
transition: all 0.3s ease-in-out;
}
/* Checked state */
.custom-checkbox.checked {
background-color: #2ecc71;
border-color: #2ecc71;
}
.custom-checkbox.checked::after {
transform: rotate(45deg) scale(1);
opacity: 1;
}
ìŽ ìì ì ëë©ìŽì ì ìŠê°ì ìŽê³ êžì ì ìž íŒëë°±ì ì ê³µíë©°, ìŽë ì¬ìŽížë¥Œ ì²ì 방묞íë ì ìžê³ ì¬ì©ììê² ê°ì¹ê° ììµëë€.
5. ìë°ì€í¬ëŠœížë¥Œ ìŽì©í ìì°šì ì ëë©ìŽì
CSSê° ê°ë ¥íꞎ íì§ë§, ë³µì¡íê³ ìíž ì졎ì ìž ì ëë©ìŽì ì ì¡°ìšíë €ë©Ž ì¢ ì¢ ìë°ì€í¬ëŠœížê° íìí©ëë€. GSAP(GreenSock Animation Platform)ì ê°ì ëŒìŽëžë¬ëЬë ê³ ì±ë¥ì ë³µì¡í ì ëë©ìŽì ì ë§ëë ì ê³ íì€ì ëë€. ê·žë¬ë ìë°ì€í¬ëŠœížë¡ íŽëì€ë¥Œ ì ëµì ìŒë¡ ì ì©íê±°ë ì€íìŒì ì¡°ìíì¬ ë§ì ìì°šì íšê³Œë¥Œ ë¬ì±í ì ììµëë€.
ìì: 늬ì€íž ììŽí ì ì찚륌 ë íìŽëìž íšê³Œ.
ê° ëŠ¬ì€íž ììŽí ìŽ ìŽì ììŽí ë€ìì íìŽëìžëë ìì°š íšê³Œë¥Œ ì»ìŒë €ë©Ž:
const listItems = document.querySelectorAll('.animated-list li');
listItems.forEach((item, index) => {
item.style.opacity = '0';
item.style.transform = 'translateY(20px)';
item.style.transition = 'opacity 0.5s ease-out, transform 0.5s ease-out';
setTimeout(() => {
item.style.opacity = '1';
item.style.transform = 'translateY(0)';
}, index * 100); // Stagger by 100ms per item
});
ìŽ ìë°ì€í¬ëŠœíž ì ê·Œ ë°©ìì CSS ížëì§ì
곌 ì§ì°ì íë¡ê·žëë° ë°©ììŒë¡ ì ì©í©ëë€. setTimeout íšìë ê³ì°ë ì§ì° íì ížëì§ì
ì ížëŠ¬ê±°íì¬ ì묎íë ìíì€ë¥Œ ë§ëëë€. ìŽ íšíŽì ì 볎륌 ëª
ííê³ ìì°šì ìŒë¡ 볎ì¬ì£Œêž° ë묞ì ì ìžê³ì ìŒë¡ íšê³Œì ì
ëë€.
ê³ êž êž°ì ë° ê³ ë € ì¬í
1. ì€í¬ë¡€ ì ì ëë©ìŽì
ì¬ì©ìê° íìŽì§ë¥Œ ìëë¡ ì€í¬ë¡€í ë ì ëë©ìŽì ì ížëŠ¬ê±°í멎 ì°žì¬ë륌 í¬ê² í¥ììí¬ ì ììµëë€. ìŽë ì¢ ì¢ ì€í¬ë¡€ ìì¹ë¥Œ ê°ì§íê³ CSS íŽëì€ë¥Œ ì ì©íê±°ë ì€íìŒì ì§ì ì¡°ìíêž° ìíŽ ìë°ì€í¬ëŠœížë¥Œ í¬íší©ëë€.
- Intersection Observer API: ììê° ë·°í¬ížì ë€ìŽì€ë ìì ì ë íšìšì ìŒë¡ ê°ì§íë ìµì ìë°ì€í¬ëŠœíž APIì ëë€.
- ëë°ìŽì±/ì€ë¡íë§(Debouncing/Throttling): ì€í¬ë¡€ ìŽë²€ížë¥Œ ì²ëЬí ë ì±ë¥ì íìì ì ëë€.
ìì: ì¹ì ìŽ ë·°í¬ížì ë€ìŽì¬ ë íìŽëìž íšê³Œ.
/* Base style: hidden */
.section-to-animate {
opacity: 0;
transform: translateY(50px);
transition: opacity 0.8s ease-out, transform 0.8s ease-out;
}
/* Style when visible */
.section-to-animate.is-visible {
opacity: 1;
transform: translateY(0);
}
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
observer.unobserve(entry.target); // Stop observing once visible
}
});
}, {
threshold: 0.1 // Trigger when 10% of the element is visible
});
document.querySelectorAll('.section-to-animate').forEach(section => {
observer.observe(section);
});
ìŽë ì¬ì©ìê° ì 볎륌 ì€í¬ë¡€íë©° í¥ë¯žë¥Œ ìì§ ìëë¡ ëì ìŽê³ ë§€ë ¥ì ìž êžŽ íìì ìœí ìž ë¥Œ ë§ëë ë° ì ìžê³ì ìŒë¡ ë늬 ì¬ì©ëë êž°ì ì ëë€.
2. SVG ì ëë©ìŽì
íì¥ ê°ë¥í ë²¡í° ê·žëíœ(SVG)ì 볞ì§ì ìŒë¡ ì ëë©ìŽì ì ì í©í©ëë€. CSS륌 ì¬ì©íì¬ SVG 겜ë¡, ë³í ë° ìì±ì ì ëë©ìŽì í ì ììµëë€.
- ê²œë¡ ì ëë©ìŽì
:
stroke-dasharrayë°stroke-dashoffsetìì±ì ì ëë©ìŽì íì¬ SVG 겜ë¡ë¥Œ 귞늜ëë€. - ë³í(Transformations): SVG ìì륌 íì , íë/ì¶ì ëë ìŽëìíµëë€.
ìì: ê°ëší SVG ë¡ê³ íì ì ëë©ìŽì .
<svg width="100" height="100" viewBox="0 0 100 100">
<path id="logo-path" d="M20,20 L80,20 L80,80 L20,80 Z" fill="none" stroke="black" stroke-width="4" />
</svg>
#logo-path {
stroke-dasharray: 161; /* Length of the path */
stroke-dashoffset: 161; /* Initially hide the path */
animation: draw-logo 2s ease-out forwards;
}
@keyframes draw-logo {
to {
stroke-dashoffset: 0;
}
}
SVG ì ëë©ìŽì ì ë¡ê³ , ììŽìœ ë° ìŒë¬ì€ížë ìŽì ì íìí©ëë€. íì¥ì±ê³Œ ì ëª ë ëë¶ì ì ìžê³ 몚ë ì¥ì¹ì ìŽìì ì ëë€. '귞늬Ʞ' íšê³Œë ìê°ì ìŒë¡ ì§êŽì ìŽë©° ê³µê° ëë 찜조 곌ì ìŒë¡ 볎ížì ìŒë¡ ìŽíŽë©ëë€.
3. ì±ë¥ ìµì í
ì ëë©ìŽì ìŽ ë©ì ëíì§ë§, ì±ë¥ì í¹í ì ì¬ì ì¥ì¹ë ë늰 ìží°ë· ì°ê²°ì ì¬ì©íë ì¬ì©ììê² ë§€ì° ì€ìí©ëë€. ì ìžê³ì ìŒë¡ ìŽê²ì ì€ìí 묞ì ì ëë€.
- Transforms ë° Opacity ì ëë©ìŽì
: ìŽë¬í ìì±ì ëžëŒì°ì ì 컎í¬ì§í° ë ìŽìŽìì ì²ëЬëë©° ìŒë°ì ìŒë¡
width,heightëëmargin곌 ê°ì ìì±ì ì ëë©ìŽì íë ê²ë³Žë€ ì±ë¥ìŽ ë°ìŽë©ëë€. - ë ìŽìŽ í©ì± ì€ìŽêž°: ìë¡ìŽ ì€íí¹ ì»ší
ì€ížë¥Œ ìì±íë ìì±(ì:
transform,opacity,filter)ì 곌ëíê² ì¬ì©í멎 ì±ë¥ì ìí¥ì ì€ ì ììµëë€. ì ì€íê² ì¬ì©íìžì. will-changeì껎ì ì¬ì©íêž°:will-changeCSS ìì±ì ëžëŒì°ì ì ê³§ ìì ì ëë©ìŽì ì ëí íížë¥Œ ì£ŒìŽ ì ì¬ì ìŒë¡ ì±ë¥ì í¥ììí¬ ì ììµëë€. ê·žë¬ë ëšì©í멎 ì±ë¥ìŽ ì íë ì ììµëë€.- ë€ìí ì¥ì¹ ë° ë€ížìí¬ìì í ì€ížíêž°: ë€ìí ì¥ì¹ ë° ë€ížìí¬ ì¡°ê±Žìì ì ëë©ìŽì ìŽ ì ìëíëì§ íìžíìžì.
ê²°ë¡ : 몚ì ìŒë¡ êžë¡ë² ì¹ì ìëª ì ë¶ìŽë£êž°
CSS 몚ì ëììžì ì¹ìì ë§€ë ¥ì ìŽê³ ì¬ì©ì ì¹íì ìŽë©° êž°ìµì ëšë 겜íì ë§ëë ê°ë ¥íê³ ë€ì¬ë€ë¥í ë°©ë²ì ì ê³µí©ëë€. CSS ížëì§ì 곌 í€íë ìì ë§ì€í°íê³ , ì ëë©ìŽì ì ìì¹ì ìŽíŽíë©°, ë€ìí êžë¡ë² ì¬ì©ìì ì구륌 ê³ ë €íšìŒë¡ìš ëì§íž 졎ì¬ê°ì ì§ì ìŒë¡ ëìŽë ì êµíê³ ì묎íë ì ëë©ìŽì ìíì€ë¥Œ ë§ë€ ì ììµëë€.
ë€ìì êž°ìµíìžì:
- 목ì ì ì§ì€íêž°: 몚ë ì ëë©ìŽì ì ì¬ì©ì ì€ì¬ì 목í륌 ë¬ì±íŽìŒ í©ëë€.
- ì±ë¥ê³Œ ì ê·Œì± ì°ì ìíêž°: ì ëë©ìŽì ìŽ ë¶ëëœê³ ë¹ ë¥Žë©° ì¬ì©ì ì ížë륌 졎ì€íëì§ íìžíìžì.
- 믞ë¬íš ë°ìë€ìŽêž°: ì¢ ì¢ ì ì ê²ìŽ ë ë§ìµëë€. ìŠê±°ìŽ ë§ìŽí¬ë¡ìží°ëì ì ì§ëì¹ê² ë³µì¡í ìíì€ë³Žë€ ë í° ìí¥ì ë¯žì¹ ì ììµëë€.
- ì ìžê³ì ìŒë¡ í ì€ížíêž°: 몚ë ì¬ëìê² ìŒêŽë 겜íì 볎ì¥íêž° ìíŽ ë€ìí ì¥ì¹, ëžëŒì°ì ë° ë€ížìí¬ ì¡°ê±Žìì ì ëë©ìŽì ì ê²ìŠíìžì.
ìŽë¬í ìì¹ì ì ì©íšìŒë¡ìš, ì¬ë¬ë¶ì CSS 몚ì ëììžì íì íì©íì¬ ìëŠë€ìž ë¿ë§ ìëëŒ ì ìžê³ ì¬ì©ìê° ì§êŽì ìŒë¡ ìŽíŽíê³ ìŠêžž ì ìë ì¹ ê²œíì ë§ë€ ì ììµëë€.